プロキシ環境でも AWS CLI で S3 エンドポイントを使ってみた
こんにちは。テクニカルサポートチームのShiinaです。
はじめに
セキュリティ要件から EC2 インスタンスから直接インターネットへ通信することを禁止している場面はよくあります。
インターネットへ通信が必要な場合、専用のプロキシサーバを経由して通信を行うといった構成も多いのではないでしょうか。
S3 サービスに対する通信はエンドポイントを利用してプライベートで行いたいところですが、
環境変数でプロキシの設定を行うと、AWS CLI で S3 のエンドポイントを利用してくれないことがありました。
プロキシ環境でも AWS CLI で S3 エンドポイントを利用する方法についてご紹介します。
困っていたこと
環境変数 HTTP_PROXY
HTTPS_PROXY
のプロキシ設定を行うと、AWS CLI の S3 コマンドを利用した際に S3 サービスへの通信の向き先としてはプロキシ設定が優先されてしまい、プロキシサーバ経由となってしまう。
実現したいこと
環境変数 HTTP_PROXY
HTTPS_PROXY
のプロキシ設定を行っていても AWS CLI から S3 サービスの通信はエンドポイント経由でアクセスしたい。
結論
プロキシ環境下でも AWS CLI から S3 にエンドポイント経由でアクセスする、代表的な方法として3つあります。
endpoint-url
パラメータで S3 エンドポイントを指定AWS_ENDPOINT_URL_S3
環境変数で S3 エンドポイントを指定~/.aws/config
ファイルで S3 エンドポイントを設定
いずれの方法でも、事前に NO_PROXY
に S3 エンドポイントを追加する必要があります。
やってみた
検証環境
-
S3 エンドポイント
ゲートウェイ型エンドポイントをプライベートサブネットに作成 -
パブリックサブネットのルートテーブル
下記ルートを追加
送信先:0.0.0.0/0
ターゲット:インターネットゲートウェイ ID -
プライベートサブネットのルートテーブル
下記ルートを追加
送信先:プレフィックスリスト ID
ターゲット:S3 ゲートウェイ型エンドポイント ID -
AWS CLI 実行用 EC2 インスタンス
Red Hat Enterprise Linux 9 の AMI を利用し、プライベートサブネットに作成 -
プロキシサーバ用 EC2 インスタンス
Amazon Linux 2 の AMI を利用し、パブリックサブネットに作成
プロキシは Squid を使用
セキュリティーグループは下記インバウンド通信を許可
ポート:3128
ソース:プライベートサブネット CIDR
環境変数 HTTP_PROXY HTTPS_PROXY によるプロキシ設定時の動作確認
プロキシサーバ用の EC2 インスタンスに接続します。
Squid プロキシをインストールし、サービスを起動します。
sudo yum install squid -y
sudo systemctl start squid
次に AWS CLI 実行用 EC2 インスタンスに接続します。
環境変数 HTTP_PROXY
HTTPS_PROXY
の設定を行います。
export HTTP_PROXY=http://xxx.xxx.xxx.xxx:3128
export HTTPS_PROXY=http://xxx.xxx.xxx.xxx:3128
export NO_PROXY=169.254.169.254
プロキシ設定が行われた状態で AWS CLI の S3 コマンドを実行してみます。
aws s3 ls s3://proxy-use-test-bucket
2024-10-18 05:16:57 818 testdata.gz
結果が返ってきました!
プロキシサーバ用の EC2 インスタンスのプロキシアクセスログを見てます。
sudo cat /var/log/squid/access.log
1729229508.382 50 10.1.131.8 TCP_TUNNEL/200 7059 CONNECT proxy-use-test-bucket.s3.ap-northeast-1.amazonaws.com:443 - HIER_DIRECT/52.219.8.198 -
アクセスログが記録されており、プロキシサーバを経由して S3 サービスにアクセスしていることがわかります。
後述の方法でプロキシサーバ経由ではなく、S3 エンドポイントを利用して通信していることを確認するため、Squid サービスは停止させておきます。
sudo systemctl stop squid
方法①:S3 コマンド実行時に endpoint-url パラメータを利用して S3 エンドポイントを指定
環境変数 NO_PROXY
にて S3 エンドポイントに対するプロキシ除外設定を追加します。
export HTTP_PROXY=http://xxx.xxx.xxx.xxx:3128
export HTTPS_PROXY=http://xxx.xxx.xxx.xxx:3128
export NO_PROXY=169.254.169.254,s3-ap-northeast-1.amazonaws.com
AWS CLI の endpoint-url
パラメータを指定して S3 コマンドを実行してみます。
aws s3 ls s3://proxy-use-test-bucket --endpoint-url https://s3-ap-northeast-1.amazonaws.com
2024-10-18 05:16:57 818 testdata.gz
結果が返ってきました!
S3 エンドポイントを利用して S3 サービスにアクセスしていることがわかります。
方法②:環境変数 AWS_ENDPOINT_URL_S3 で S3 エンドポイントを指定
環境変数 NO_PROXY
にて S3 エンドポイントに対するプロキシ除外設定を追加します。
export HTTP_PROXY=http://xxx.xxx.xxx.xxx:3128
export HTTPS_PROXY=http://xxx.xxx.xxx.xxx:3128
export NO_PROXY=169.254.169.254,s3-ap-northeast-1.amazonaws.com
環境変数 AWS_ENDPOINT_URL_S3
を設定します。
export AWS_ENDPOINT_URL_S3=https://s3-ap-northeast-1.amazonaws.com
AWS CLI の S3 コマンドを実行してみます。
aws s3 ls s3://proxy-use-test-bucket
2024-10-18 05:16:57 818 testdata.gz
結果が返ってきました!
S3 エンドポイントを利用して S3 サービスにアクセスしていることがわかります。
方法③:設定ファイル ~/.aws/config に S3 サービスのセクションタイプで S3 エンドポイントを指定
環境変数 NO_PROXY
にて S3 エンドポイントに対するプロキシ除外設定を追加します。
export HTTP_PROXY=http://xxx.xxx.xxx.xxx:3128
export HTTPS_PROXY=http://xxx.xxx.xxx.xxx:3128
export NO_PROXY=169.254.169.254,s3-ap-northeast-1.amazonaws.com
AWS CLI の設定ファイル ~/.aws/config
に S3 サービスのセクションタイプを追加し、S3 エンドポイントを指定してみます。
[default]
region = ap-northeast-1
output = json
services = s3
[services s3]
s3 =
endpoint_url = https://s3-ap-northeast-1.amazonaws.com
AWS CLI の S3 コマンドを実行してみます。
aws s3 ls s3://proxy-use-test-bucket
2024-10-18 05:16:57 818 testdata.gz
結果が返ってきました!
S3 エンドポイントを利用して S3 サービスにアクセスしていることがわかります。
エンドポイント設定の優先順序について
方法①、②、③それぞれ設定したらどうなるのでしょうか?
AWS CLI のエンドポイント設定では優先順序が決まっています。
記載の方法では①>②>③の順で優先されます。
まとめ
プロキシ環境でもプロキシサーバを経由せず、 AWS CLI で S3 エンドポイントを使うことができます。
方法①の場合、コマンドを実行するたびにパラメータを指定する必要があり、手間がかかります。
また、手順書も煩雑になりがちです。
特にエンドポイントを意識せずにコマンドを利用できる、方法②もしくは③が個人的にはおすすめです。
なお、AWS CLI のエンドポイント設定には優先順序がある点にはご注意ください。
本記事が誰かのお役に立てれば幸いです。
参考